package datamanager;

import java.util.ArrayList;
import util.Data;

import java.util.List;

import exceptions.MyMoneyException;



public class DataManager {

	private ArrayList <Gasto> listaDeGastos;
	private ArrayList <Entrada> listaDeEntradas;
	private ArrayList <Conta> listaDeContas;
	
	public DataManager() {
		listaDeGastos = new ArrayList <Gasto>();
		listaDeEntradas = new ArrayList <Entrada>();
		listaDeContas = new ArrayList<Conta>();
		
	}
	
	public void cadastraGasto(Gasto gasto) throws MyMoneyException {
		for (Gasto g : listaDeGastos) {
			if (g.getId().equalsIgnoreCase(gasto.getId())){
				throw new MyMoneyException ("O registro de gasto ja existe para o ID especificado.");
			}
		}
		listaDeGastos.add(gasto);
	}

	public void cadastraEntrada(Entrada entrada) {
		listaDeEntradas.add(entrada);
	}

	public ArrayList<Gasto> getListaDeGastos() {
		return new ArrayList<Gasto>(listaDeGastos);
	}

	public ArrayList<Entrada> getListaDeEntradas() {
		return new ArrayList<Entrada>(listaDeEntradas);
	}

	public void reset() {
		listaDeGastos.clear();
		listaDeEntradas.clear();
		listaDeContas.clear();
	}
	
	public List<Entrada> consultaEntradasEntre(Data dataIni, Data dataFin) throws MyMoneyException {
		List<Entrada> entradasConsulta = new ArrayList<Entrada>();
		for (Entrada entrada : listaDeEntradas) {
			if((entrada.getData().compareTo(dataIni) >= 0) && (entrada.getData().compareTo(dataFin) <= 0)){
				entradasConsulta.add(entrada);
			}
		}
		
		if(entradasConsulta.isEmpty()){
			throw new MyMoneyException("Nao existem entradas cadastradas no periodo especificado.");
		}
		return entradasConsulta;
	}

	public List<Gasto> consultaGastosEntre(Data dataIni, Data dataFin) throws MyMoneyException {
		List<Gasto> gastosConsulta = new ArrayList<Gasto>();
		for (Gasto gasto : listaDeGastos) {
			if((gasto.getData().compareTo(dataIni) >= 0) && (gasto.getData().compareTo(dataFin) <= 0)){
				gastosConsulta.add(gasto);
			}
		}
		
		if(gastosConsulta.isEmpty()){
			throw new MyMoneyException("Nao existem gastos cadastrados no periodo especificado.");
		}
		return gastosConsulta;
	}
	
	public List<Conta> consultaContasEntre(Data dataIni, Data dataFin) throws MyMoneyException {
		List<Conta> contasConsulta = new ArrayList<Conta>();
		for (Conta conta : listaDeContas) {
			if((conta.getData().compareTo(dataIni) >= 0) && (conta.getData().compareTo(dataFin) <= 0)){
				contasConsulta.add(conta);
			}
		}
		
		if(contasConsulta.isEmpty()){
			throw new MyMoneyException("Nao existem contas cadastradas no periodo especificado.");
		}
		return contasConsulta;
	}

	
	//Edicao simples.
	public void editaGasto(Gasto gasto) throws MyMoneyException {
		int counter = 0;
		for (int i = 0; i < listaDeGastos.size();i++) {
			if(listaDeGastos.get(i).getId().equalsIgnoreCase(gasto.getId())){
				listaDeGastos.remove(i);		
				listaDeGastos.add(gasto);
				counter = 1;
			}
		}
		if(counter == 0){
			throw new MyMoneyException("O identificador de Gasto especificado nao esta cadastrado no sistema.");
		}
	}

	public void setGastosDeUsuario(List<Gasto> gastosUsuario){
		listaDeGastos = new ArrayList<Gasto>();
		listaDeGastos.addAll(gastosUsuario);
		
	}

	
//	public static void main(String[] args) {
//		Data data = new Data("05/05/09");
//		Data dataIgual = new Data("05/05/09");
//		Data dataMaior = new Data("15/05/09");
//		Data dataMenor = new Data("05/04/09");
//		System.out.println(data.compareTo(dataMenor));
//		System.out.println(data.compareTo(dataIgual));
//		System.out.println(data.compareTo(dataMaior));
//	}



	public void cadastraConta(Conta conta) throws MyMoneyException {
		for (Conta contaCadastrada : listaDeContas) {
			if (contaCadastrada.getId().equalsIgnoreCase(conta.getId())){
				throw new MyMoneyException ("O registro de gasto ja existe para o ID especificado.");
			}
		}
		listaDeContas.add(conta);
	}
	
	public void setContasDeUsuario(List<Conta> contasUsuario){
		listaDeContas= new ArrayList<Conta>();
		listaDeContas.addAll(contasUsuario);		
	}

	public ArrayList<Conta> getListaDeContas() {
		return new ArrayList<Conta>(listaDeContas);
	}

	public void setEntradasDeUsuario(List<Entrada> entradas) {
		listaDeEntradas = new ArrayList<Entrada>();
		listaDeEntradas.addAll(entradas);				
	}

	public int getNextIdGasto(){
		int maiorId = 0;
		for (int i = 0; i < listaDeGastos.size(); i++) {
			String gastoId  = listaDeGastos.get(i).getId();
			int id = Integer.valueOf(gastoId.replace("id", ""));
			if(id > maiorId){
				maiorId = id;
			}
		}
		return maiorId+1;
	}
	
	public int getNextIdEntrada(){
		int maiorId = 0;
		for (int i = 0; i < listaDeEntradas.size(); i++) {
			String gastoId  = listaDeEntradas.get(i).getId();
			int id = Integer.valueOf(gastoId.replace("id", ""));
			if(id > maiorId){
				maiorId = id;
			}
		}
		return maiorId+1;
	}

	public void cadastraContas(List<Conta> contas) throws MyMoneyException{
		for(Conta conta : contas){
			cadastraConta(conta);
		}
	}
	
	public void cadastraGastos(List<Gasto> gastos) throws MyMoneyException{
		for(Gasto gasto: gastos){
			cadastraGasto(gasto);
		}
	}
	public void cadastraEntradas(List<Entrada> entradas) throws MyMoneyException{
		for(Entrada entrada: entradas){
			cadastraEntrada(entrada);
		}
	}

}
